#include "head.h" //用户链表操作实现

const wchar_t *title_set_f = L"设定航班菜单";
const wchar_t *option_set_f[] = {
    L"删除航班",
    L"添加航班",
    L"退出"};

// 设定航班
void set_flight(f_list *list)
{
    // 安全判定
    if (list == NULL)
    {
        printf("Error: List is NULL!\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("Error: List is empty!\n");
        return;
    }

    // 获取航班信息
    f_list *list1 = init_double_link_list(); // 头结点设定链表用于存储文件中的数据
    flight_data_file_scanf(list1);           // 从文件中读取信息到链表
    print_forward_double_link_list(list1);   // 讲链表信息打印到终端
    int i;                                   // 选择功能
    int count = 1;                           // 要删除的位置
    int j;                                   // 要删除的航班号
    f_node *ptr = NULL;
    f_data data;
    i = display_menu(title_set_f, option_set_f, 3);
    switch (i)
    {
    case 1: // 删除航班
        printf("请输入要删除的航班班次");
        scanf("%d", &j);
        ptr = list->next;
        do
        {
            if (j == ptr->data.id)
            {
                // printf("%d", count);
                delete_double_node(list, count);
                flight_data_file_print(list);
                break;
            }
            count++;
            ptr = ptr->next;
        } while (list->next != ptr);
        return;
        break;
    case 2: // 添加航班
        printf("请输入：班次\t机型\t起点站\t终点站\t起飞时间\t\t到达时间\t飞行时间\t票价\t载客量\t剩余座位\t是否飞\n");
        scanf("%8d\t", &data.id);                                       // 航班班次
        scanf("%16s\t", data.flighttype);                               // 飞机机型
        scanf("%12s\t", data.startcity);                                // 航班起点站
        scanf("%12s\t", data.arrivecity);                               // 航班终点站
        scanf("%02d:%02d\t", &data.starttime[0], &data.starttime[1]);   // 起飞时间
        scanf("%02d:%02d\t", &data.arrivetime[0], &data.arrivetime[1]); // 到达时间
        scanf("%12s\t\t", data.flytime);                                // 飞行时间
        scanf("%8d\t", &data.value);                                    // 票价
        scanf("%8d\t", &data.maxNUM);                                   // 额定载客量
        scanf("%10d\t", &data.leftbuyersa);                             // 剩余座位数量
        scanf("%s\n", &data.whetherfly);
        insert_double_node(list, data, 1); // 将数据插入
        flight_data_file_print(list);      // 写入到文件中
        break;
    default: // 退出
        exit(0);
        break;
    }
}

const wchar_t *title_mod_f = L"修改航班菜单";
const wchar_t *option_mod_f[] = {
    L"航班班次",
    L"起飞时间",
    L"到达时间",
    L"飞行时间",
    L"票价",
    L"载客量",
    L"剩余座位",
    L"是否飞",
    L"退出"};

// 修改航班
void mod_flight(f_list *list)
{
    // 安全判定
    if (list == NULL)
    {
        printf("Error: List is NULL!\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("Error: List is empty!\n");
        return;
    }
    // 获取航班信息
    f_list *list1 = init_double_link_list(); // 头结点设定链表用于存储文件中的数据

    // printf("1\n");
    int i_1; // 选择功能
    // int count;
    int j; // 要修改的航班号和所修要修改信息暂存
    // char buf[128];
    f_node *ptr = NULL;
    // f_data *data;
    // printf("1\n");
    while (1)
    {
        ui_clear();
        flight_data_file_scanf(list1);         // 从文件中读取信息到链表
        print_forward_double_link_list(list1); // 讲链表信息打印到终端
        i_1 = display_menu(title_mod_f, option_mod_f, 9);
        // printf("1\n");
        switch (i_1)
        {
        case 1: // 航班班次
            printf("请输入要修改的航班班次");
            scanf("%d", &j);
            ptr = find_double_node_pos(list, j);
            if (NULL == ptr)
            {
                printf("Error: 未找到该航班!\n");
                break;
            }
            printf("请输入修改后的航班班次");
            scanf("%d", &ptr->data.id);
            flight_data_file_print(list);

            break;
        case 2: // 起飞时间
            printf("请输入要修改的航班班次:");
            scanf("%d", &j);
            ptr = find_double_node_pos(list, j);
            if (NULL == ptr)
            {
                printf("Error: 未找到该航班!\n");
                break;
            }
            printf("请输入修改后的起飞时间:");
            scanf("%02d:%02d", &ptr->data.starttime[0], &ptr->data.starttime[1]);
            flight_data_file_print(list);
            break;
        case 3: // 到达时间
            printf("请输入要修改的航班班次:");
            scanf("%d", &j);
            ptr = find_double_node_pos(list, j);
            if (NULL == ptr)
            {
                printf("Error: 未找到该航班!\n");
                break;
            }
            printf("请输入修改后的到达时间:");
            scanf("%02d:%02d", &ptr->data.arrivetime[0], &ptr->data.arrivetime[1]);
            flight_data_file_print(list);
            break;
        case 4: // 飞行时间
            printf("请输入要修改的航班班次:");
            scanf("%d", &j);
            ptr = find_double_node_pos(list, j);
            if (NULL == ptr)
            {
                printf("Error: 未找到该航班!\n");
                break;
            }
            printf("请输入修改后的飞行时间:");
            scanf("%10s", ptr->data.flytime);
            flight_data_file_print(list);
            break;
        case 5: // 票价
            printf("请输入要修改的航班班次:");
            scanf("%d", &j);
            ptr = find_double_node_pos(list, j);
            if (NULL == ptr)
            {
                printf("Error: 未找到该航班!\n");
                break;
            }
            printf("请输入修改后的票价:");
            scanf("%d", &ptr->data.value);
            flight_data_file_print(list);
            break;
        case 6: // 载客量
            printf("请输入要修改的航班班次:");
            scanf("%d", &j);
            ptr = find_double_node_pos(list, j);
            if (NULL == ptr)
            {
                printf("Error: 未找到该航班!\n");
                break;
            }
            printf("请输入修改后的载客量:");
            scanf("%d", &ptr->data.maxNUM);
            flight_data_file_print(list);
            break;
        case 7: // 剩余座位
            printf("请输入要修改的航班班次:");
            scanf("%d", &j);
            ptr = find_double_node_pos(list, j);
            if (NULL == ptr)
            {
                printf("Error: 未找到该航班!\n");
                break;
            }
            printf("请输入修改后的载客量:");
            scanf("%d", &ptr->data.leftbuyersa);
            flight_data_file_print(list);
            break;
            break;
        case 8: // 是否飞
            printf("请输入要修改的航班班次:");
            scanf("%d", &j);
            ptr = find_double_node_pos(list, j);
            if (NULL == ptr)
            {
                printf("Error: 未找到该航班!\n");
                break;
            }
            printf("请输入修改后的载客量:");
            scanf("%s", &ptr->data.whetherfly);
            flight_data_file_print(list);
            break;
            break;
        default: // 退出
            return;
            break;
            clear_double_link_list(list1);
        }
    }
}

const wchar_t *title_mod_com_u = L"设定航班菜单";
const wchar_t *option_mod_com_u[] = {
    L"用户名",
    L"用户密码",
    L"用户身份证信息",
    L"余额",
    // L"存储航班信息",
    L"退出"};

// 修改普通用户
void mod_com_u(u_list *list)
{
    // 安全判定
    if (list == NULL)
    {
        printf("Error: List is NULL!\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("Error: List is empty!\n");
        return;
    }
    // u_list *list1 = init_double_link_list_u(); // 头结点设定链表用于存储文件中的数据
    // flight_data_file_scanf(list1);           // 从文件中读取信息到链表
    print_forward_double_link_list_u(list); // 讲链表信息打印到终端
    int i;                                  // 选择功能
    int count = 1;                          //
    char buf[128];                          // 存储名字
    u_node *ptr = NULL;
    // u_data data; // 存储结构体数据
    i = display_menu(title_mod_com_u, option_mod_com_u, 5);
    switch (i)
    {
    case 1: // 用户名
        printf("请输入要修改用户的名字");
        scanf("%s", buf); // 存储修改用户姓名
        ptr = list->next;
        do
        {
            change_u(list, buf, ptr);
            ptr = ptr->next;
        } while (ptr != list->next);
        printf("无此用户");
        break;
    case 2: // 用户密码
        printf("请输入要修改用户的名字");
        scanf("%s", buf);
        ptr = list->next;
        do
        {
            change_pass(list, buf, ptr);
            ptr = ptr->next;
        } while (ptr != list->next);
        printf("无此用户");
        break;
    case 3: // 用户身份证信息
        printf("请输入要修改用户的名字");
        scanf("%s", buf);
        ptr = list->next;
        do
        {
            change_grade(list, buf, ptr, count);
            ptr = ptr->next;
        } while (ptr != list->next);
        printf("无此用户");
        break;
    case 4: // 余额
        printf("请输入要修改用户的名字");
        scanf("%s", buf);
        ptr = list->next;
        do
        {
            change_v(list, buf, ptr);
            ptr = ptr->next;
        } while (ptr != list->next);
        printf("无此用户");
        break;
    case 5: // 存储航班信息
        break;
    default: // 退出
        break;
    }
}

// 用户更改
void change_u(u_list *list, char *buf, u_node *ptr) // 按等级选择文件
{
    if (0 == strcmp(ptr->data.name, buf))
    {
        printf("请输入修改后的用户名:");
        scanf("%s", ptr->data.name); // 将名字写入所选中的节点
        char file_name[128] = "";
        switch (ptr->data.grade)
        {
        case 2:
            strcpy(file_name, REGULAR_FILE);
            break;
        case 3:
            strcpy(file_name, SILVER_FILE);
            break;
        case 4:
            strcpy(file_name, REGULAR_FILE);
            break;
        case 5:
            strcpy(file_name, PLATINUM_FILE);
            break;
        default:
            break;
        }
        u_list *list1 = init_double_link_list_u();
        print_forward_double_link_list_u(list1);
        user_data_file_scanf(list1, file_name);
        print_forward_double_link_list_u(list1);
        u_node *ptr1 = list1->next;
        do
        {
            if (0 == strcmp(ptr1->data.name, buf))
            {
                strcpy(ptr1->data.name, ptr->data.name);
                user_data_file_print(list1, file_name);
                // print_forward_double_link_list_u(list1);
                return ;
            }
            ptr1 = ptr1->next;
        } while (ptr != list->next);
    }
}

// 密码更改
void change_pass(u_list *list, char* buf, u_node *ptr) // 按等级选择文件
{
    if (0 == strcmp(ptr->data.name, buf))
    {
        printf("请输入修改后的用户密码:");
        scanf("%s", ptr->data.passwd); // 将名字写入所选中的节点
        char file_name[128] = "";
        switch (ptr->data.grade)
        {
        case 2:
            strcpy(file_name, REGULAR_FILE);
            break;
        case 3:
            strcpy(file_name, SILVER_FILE);
            break;
        case 4:
            strcpy(file_name, REGULAR_FILE);
            break;
        case 5:
            strcpy(file_name, PLATINUM_FILE);
            break;
        default:
            break;
        }
        u_list *list1 = init_double_link_list_u();
        user_data_file_scanf(list1, file_name);
        print_forward_double_link_list_u(list1);
        u_node *ptr1 = list1->next;
        do
        {
            if (0 == strcmp(ptr1->data.name, buf))
            {
                strcpy(ptr1->data.passwd, ptr->data.passwd);
                user_data_file_print(list1, file_name);
                // print_forward_double_link_list_u(list1);
                return ;
            }
            ptr1 = ptr1->next;
        } while (ptr != list->next);
    }
}

// 余额更改
void change_v(u_list *list, char *buf, u_node *ptr) // 按等级选择文件
{
    if (0 == strcmp(ptr->data.name, buf))
    {
        printf("请输入修改后的用户余额:");
        scanf("%d", &ptr->data.value); // 将名字写入所选中的节点
        char file_name[128] = "";
        switch (ptr->data.grade)
        {
        case 2:
            strcpy(file_name, REGULAR_FILE);
            break;
        case 3:
            strcpy(file_name, SILVER_FILE);
            break;
        case 4:
            strcpy(file_name, REGULAR_FILE);
            break;
        case 5:
            strcpy(file_name, PLATINUM_FILE);
            break;
        default:
            break;
        }
        u_list *list1 = init_double_link_list_u();
        user_data_file_scanf(list1, file_name);
        print_forward_double_link_list_u(list1);
        u_node *ptr1 = list1->next;
        do
        {
            if (0 == strcmp(ptr1->data.name, buf))
            {
                ptr1->data.value = ptr->data.value;
                user_data_file_print(list1, file_name);
                // print_forward_double_link_list_u(list1);
                return;
            }
            ptr1 = ptr1->next;
        } while (ptr != list->next);
    }
}

//等级修改
void change_grade(u_list *list, char *buf, u_node *ptr, int count) // 按等级选择文件
{
    if (0 == strcmp(ptr->data.name, buf))
    {
        u_data data1 = ptr->data; // 修改前的数据
        printf("请输入修改后的用户等级:");
        scanf("%d", &ptr->data.grade); // 将名字写入所选中的节点
        char file_name1[128] = "";    // 修改后数据存放的文件
        char file_name2[128] = "";    // 修改前数据存放的文件
        switch (data1.grade)
        {
        case 2:
            strcpy(file_name2, REGULAR_FILE);
            break;
        case 3:
            strcpy(file_name2, SILVER_FILE);
            break;
        case 4:
            strcpy(file_name2, REGULAR_FILE);
            break;
        case 5:
            strcpy(file_name2, PLATINUM_FILE);
            break;
        default:
            break;
        }

        u_list *list1 = init_double_link_list_u();
        user_data_file_scanf(list1, file_name2);
        print_forward_double_link_list_u(list1);
        u_node *ptr1 = list1->next;
        do
        {
            if (0 == strcmp(data1.name, buf))
            {
                delete_double_node_u(list1, count);
                user_data_file_print(list1, REGULAR_FILE);
                switch (ptr->data.grade)
                {
                case 1:
                    strcpy(file_name1, ADMIN_FILE);
                    break;
                case 2:
                    strcpy(file_name1, REGULAR_FILE);
                    break;
                case 3:
                    strcpy(file_name1, SILVER_FILE);
                    break;
                case 4:
                    strcpy(file_name1, REGULAR_FILE);
                    break;
                case 5:
                    strcpy(file_name1, PLATINUM_FILE);
                    break;
                default:
                    break;
                }
                u_list *list2 = init_double_link_list_u(); // 链表用于存放更改后权限的信息文件用于增加用户
                user_data_file_scanf(list2, file_name1);
                insert_double_node_u(list2, ptr->data, 1);
                user_data_file_print(list2, file_name1);
            }
            ptr1 = ptr1->next;
            count++;
        } while (ptr != list->next);
    }
}
